{"values":{"name":"El. laiškų automatinis failų skaitymas","code":"SS-OCR-READ-EMAIL","description":"Email nuskaitymas kas 1 valandą nuo 6:00 iki 22:00 tik darbo dienomis (pirmadienis–penktadienis)","triggerTypeId":2,"cronExpression":"0 0 6-22 ? * MON-FRI","scriptContent":"const parameterValues = await rql(`Select module, company.id, value from parameterValues WITH code = 'SS-OCR-EMAIL'`);\nif (!parameterValues || parameterValues.length === 0) {\n\tthrow new UserError(getTranslations(\"parameter.ocr.email.not.found\"));\n}\n\nconst isCompanyPresent = companyId && companyId !== '00000000-0000-0000-0000-000000000000';\nconst groupedByCompany = parameterValues.reduce((acc, item) => {\n\tconst valueCompanyId = item.company?.id;\n\tif (!valueCompanyId) return acc;\n\n\tif (isCompanyPresent) {\n\t\tif (companyId !== valueCompanyId) {\n\t\t\treturn acc;\n\t\t}\n\t}\n\n\tif (!acc[valueCompanyId]) {\n\t\tacc[valueCompanyId] = [];\n\t}\n\n\tacc[valueCompanyId].push(item);\n\treturn acc;\n}, {});\n\nfor (const [valueCompanyId, companyParameterValues] of Object.entries(groupedByCompany)) {\n\tconst paramValues = companyParameterValues.flatMap(param => parseParameterValue(param));\n\n\tconst saleInvoiceEmails = paramValues.filter(param => param?.tradeRef === 0).flatMap(param => param.emailAddress);\n\tconst saleOrderEmails = paramValues.filter(param => param?.tradeRef === 20).flatMap(param => param.emailAddress);\n\tconst purchaseInvoiceEmails = paramValues.filter(param => param?.tradeRef === 1).flatMap(param => param.emailAddress);\n\tconst purchaseOrderEmails = paramValues.filter(param => param?.tradeRef === 21).flatMap(param => param.emailAddress);\n\tconst emailsWithoutOcr = paramValues.filter(param => param.tradeRef === null || param.tradeRef === undefined).flatMap(param => param.emailAddress);\n\n\tconst companyById = await rql(`Select name, id from company WITH companyId = ${valueCompanyId}`);\n\tconst companyName = companyById?.name;\n\n\tconst withoutOcrEmailIds = await readEmail(emailsWithoutOcr, valueCompanyId, companyName) || [];\n\tif (emailsWithoutOcr && emailsWithoutOcr.length > 0 && withoutOcrEmailIds && withoutOcrEmailIds.length === 0) {\n\t\tlog.info(getTranslations(\"without.ocr.nothing.read\") + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t}\n\n\tif (saleInvoiceEmails.length === 0 && saleOrderEmails.length === 0 && purchaseInvoiceEmails.length === 0 && purchaseOrderEmails.length === 0) {\n\t\tlog.info(getTranslations(\"no.emails.to.ocr\") + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\tcontinue;\n\t}\n\n\tconst saleInvoiceEmailIds = await readEmail(saleInvoiceEmails, valueCompanyId, companyName) || [];\n\tconst saleOrderEmailIds = await readEmail(saleOrderEmails, valueCompanyId, companyName) || [];\n\tconst purchaseInvoiceEmailIds = await readEmail(purchaseInvoiceEmails, valueCompanyId, companyName) || [];\n\tconst purchaseOrderEmailIds = await readEmail(purchaseOrderEmails, valueCompanyId, companyName) || [];\n\n\tconst allEmailIds = [\n\t\t...new Set([\n\t\t\t...saleInvoiceEmailIds,\n\t\t\t...saleOrderEmailIds,\n\t\t\t...purchaseInvoiceEmailIds,\n\t\t\t...purchaseOrderEmailIds\n\t\t])\n\t];\n\n\tif (allEmailIds.length === 0) {\n\t\tcontinue;\n\t}\n\n\tconst stringifiedIds = allEmailIds.join(',');\n\tconst mails = await rql(`@ALL Select id, to, attachments, emailDirection.id from emailNotificationLogs WITH companyId=${valueCompanyId} WHERE id=[${stringifiedIds}]`);\n\tif (!mails || mails.length === 0) {\n\t\tlog.error(getTranslations(\"read.email.logs.not.found\") + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\tcontinue;\n\t}\n\n\tconst saleInvoiceFileIds = findFileIdsFromEmails(saleInvoiceEmails, mails) || [];\n\tconst saleOrderFileIds = findFileIdsFromEmails(saleOrderEmails, mails) || [];\n\tconst purchaseInvoiceFileIds = findFileIdsFromEmails(purchaseInvoiceEmails, mails) || [];\n\tconst purchaseOrderFileIds = findFileIdsFromEmails(purchaseOrderEmails, mails) || [];\n\n\tif (saleInvoiceFileIds.length === 0 && saleOrderFileIds.length === 0 && purchaseInvoiceFileIds.length === 0 && purchaseOrderFileIds.length === 0) {\n\t\tlog.warn(getTranslations(\"files.by.email.not.found\") + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\tcontinue;\n\t}\n\n\tawait processDocuments(saleInvoiceFileIds, 0, valueCompanyId, companyName);\n\tawait processDocuments(saleOrderFileIds, 20, valueCompanyId, companyName);\n\tawait processDocuments(purchaseInvoiceFileIds, 1, valueCompanyId, companyName);\n\tawait processDocuments(purchaseOrderFileIds, 21, valueCompanyId, companyName);\n}\nreturn;\n\nasync function readEmail(emails, valueCompanyId, companyName) {\n\tconst mailIds = [];\n\tif (emails && emails.length > 0) {\n\t\tfor (const email of emails) {\n\t\t\ttry {\n\t\t\t\tconst readEmail = await mailIngester(email, valueCompanyId);\n\t\t\t\tif (readEmail) {\n\t\t\t\t\tmailIds.push(...readEmail.ids);\n\t\t\t\t}\n\t\t\t\tif (readEmail && readEmail?.status !== 'SUCCESS') {\n\t\t\t\t\tlog.error(JSON.stringify(readEmail));\n\t\t\t\t\tlog.error(getTranslations(\"error.occur.reading.email\") + \": \" + email + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\t\t\t}\n\t\t\t\tif (!readEmail) {\n\t\t\t\t\tlog.error(getTranslations(\"error.occur.reading.email.response\") + \": \" + email + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\t\t\t}\n\t\t\t\tif (readEmail && readEmail?.status === 'SUCCESS') {\n\t\t\t\t\tconst readIds = readEmail?.ids || [];\n\t\t\t\t\tif (readIds.length > 0) {\n\t\t\t\t\t\tlog.info(getTranslations(\"success.read.email\") + \": \" + email + \", \" + getTranslations(\"email.notification.logs\") + \": \" + readIds.join(','));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog.info(getTranslations(\"success.read.email\") + \": \" + email + \". \" + getTranslations(\"no.emails.with.attachments\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error?.message ?? error.description;\n\t\t\t\tif (message && message.includes(\"AUTHENTICATIONFAILED\")) {\n\t\t\t\t\tlog.error(getTranslations(\"error.email.incorrect.login\") + \": \" + email + \", \" + getTranslations(\"company.message\") + \": \" + companyName)\n\t\t\t\t} else {\n\t\t\t\t\tlog.debug(message);\n\t\t\t\t\tlog.error(getTranslations(\"error.occur.reading.email\") + \": \" + email + \", \" + getTranslations(\"company.message\") + \": \" + companyName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn mailIds;\n}\n\nasync function processDocuments(emailsWithFileIds, referenceTypeId, valueCompanyId, companyName) {\n\tfor (const emailWithFileIds of emailsWithFileIds) {\n\t\tconst email = emailWithFileIds.email;\n\t\tconst fileIds = emailWithFileIds.ids;\n\t\tif (fileIds && fileIds.length > 0) {\n\t\t\ttry {\n\t\t\t\tawait mutate('digitizeDocumentsBatch', { ids: fileIds, typeId: referenceTypeId, companyId: valueCompanyId, email: email });\n\t\t\t\tlog.info(getTranslations(\"document.digitize.passed\") + \": \" + getTranslations(\"type.message\") + \": \" + getTypeNameById(referenceTypeId) + \", \" + getTranslations(\"company.message\") + \": \" + companyName + \", \" + email);\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage = error.message ?? error.description;\n\t\t\t\tlog.info(getTranslations(\"document.digitize.result\") + \": \" + errorMessage + \", \" + getTranslations(\"type.message\") + \": \" + getTypeNameById(referenceTypeId) + \", \" + getTranslations(\"company.message\") + \": \" + companyName + \", \" + email);\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getTranslatedStatus(responseStatus) {\n\tif (responseStatus === \"WARNING\") {\n\t\treturn getTranslations(\"status.warning\");\n\t}\n\tif (responseStatus === \"SUCCESS\") {\n\t\treturn getTranslations(\"status.success\");\n\t}\n\tif (responseStatus === \"FAILED\") {\n\t\treturn getTranslations(\"status.failed\");\n\t}\n\treturn getTranslations(\"reference.type.unknown\");\n}\n\nfunction getTypeNameById(referenceTypeId) {\n\tif (referenceTypeId === 0) {\n\t\treturn getTranslations(\"reference.type.sales\");\n\t}\n\tif (referenceTypeId === 20) {\n\t\treturn getTranslations(\"reference.type.sale.orders\");\n\t}\n\tif (referenceTypeId === 1) {\n\t\treturn getTranslations(\"reference.type.purchases\");\n\t}\n\tif (referenceTypeId === 21) {\n\t\treturn getTranslations(\"reference.type.purchase.orders\");\n\t}\n\treturn getTranslations(\"reference.type.unknown\");\n}\n\nfunction findFileIdsFromEmails(emails, mailLogs) {\n\tconst fileIds = [];\n\tfor (const email of emails) {\n\t\tconst fileIdsOfEmails = mailLogs.filter(param => param?.to?.includes(email) && param?.emailDirection?.id === \"RECEIVED\").flatMap(param => param?.attachments).map(param => param?.fileId);\n\t\tif (fileIdsOfEmails.length > 0) {\n\t\t\tfileIds.push({ email: email, ids: fileIdsOfEmails });\n\t\t}\n\t}\n\treturn fileIds;\n}\n\nfunction parseParameterValue(parameterValue) {\n\tconst value = JSON.parse(parameterValue.value);\n\treturn {\n\t\temailAddress: parameterValue?.module,\n\t\ttradeRef: value?.tradeRef\n\t}\n}\n\nfunction getTranslations(messagePath) {\n\tconst language = initial?.acceptLanguage === \"lt\" ? \"lt\" : \"en\";\n\tconst messages = {\n\t\t\"select.mails\": {\n\t\t\tlt: \"Prašome pasirinkti įrašus\",\n\t\t\ten: \"Please select documents\",\n\t\t},\n\t\t\"parameter.ocr.email.not.found\": {\n\t\t\tlt: \"Prašome apsirašyti SS-OCR-EMAIL parametro reikšmę\",\n\t\t\ten: \"Please configure SS-OCR-EMAIL parameter value\",\n\t\t},\n\t\t\"read.email.logs.not.found\": {\n\t\t\tlt: \"Nuskaityti El. laiškų žurnalai nerasti\",\n\t\t\ten: \"Read email logs was not found\"\n\t\t},\n\t\t\"no.emails.to.ocr\": {\n\t\t\tlt: \"Nerastos parametro reikšmės dokumentų skaitmeninimui\",\n\t\t\ten: \"Parameter values to digitize documents was not found\"\n\t\t},\n\t\t\"no.emails.with.attachments\": {\n\t\t\tlt: \"Nerasti el. laiškai su priedais\",\n\t\t\ten: \"Emails with attachments was not found\"\n\t\t},\n\t\t\"files.by.email.not.found\": {\n\t\t\tlt: \"Nerasti failai pagal El. laiškų žurnalus\",\n\t\t\ten: \"Files not found by email logs\"\n\t\t},\n\t\t\"without.ocr.nothing.read\": {\n\t\t\tlt: \"Be skaitmeninimo: Laiškuose niekas nenuskaityta\",\n\t\t\ten: \"Without digitization: In emails was nothing found\"\n\t\t},\n\t\t\"document.digitize.result\": {\n\t\t\tlt: \"Dokumentų skaitmeninimo rezultatas\",\n\t\t\ten: \"Documents digitization result\"\n\t\t},\n\t\t\"document.digitize.passed\": {\n\t\t\tlt: \"Dokumentai perduoti skaitmeninimui\",\n\t\t\ten: \"Documents passed to digitize\"\n\t\t},\n\t\t\"type.message\": {\n\t\t\tlt: \"Tipas\",\n\t\t\ten: \"Type\"\n\t\t},\n\t\t\"reference.type.sales\": {\n\t\t\tlt: \"Pardavimų sąskaitos\",\n\t\t\ten: \"Sale invoices\"\n\t\t},\n\t\t\"reference.type.sale.orders\": {\n\t\t\tlt: \"Pardavimų užsakymai\",\n\t\t\ten: \"Sale orders\"\n\t\t},\n\t\t\"reference.type.purchases\": {\n\t\t\tlt: \"Pirkimų sąskaitos\",\n\t\t\ten: \"Purchase invoices\"\n\t\t},\n\t\t\"reference.type.purchase.orders\": {\n\t\t\tlt: \"Pirkimų užsakymai\",\n\t\t\ten: \"Purchase orders\"\n\t\t},\n\t\t\"reference.type.unknown\": {\n\t\t\tlt: \"Nežinomas\",\n\t\t\ten: \"Unknown\"\n\t\t},\n\t\t\"status.success\": {\n\t\t\tlt: \"Sėkmingas\",\n\t\t\ten: \"Success\"\n\t\t},\n\t\t\"status.warning\": {\n\t\t\tlt: \"Įspėjimas\",\n\t\t\ten: \"Warning\"\n\t\t},\n\t\t\"status.failed\": {\n\t\t\tlt: \"Nepavykęs\",\n\t\t\ten: \"Failed\"\n\t\t},\n\t\t\"company.message\": {\n\t\t\tlt: \"Įmonė\",\n\t\t\ten: \"Company\"\n\t\t},\n\t\t\"error.occur.reading.email.response\": {\n\t\t\tlt: \"Įvyko klaida, rezultatas negrąžintas iš laiškų nuskaitymo\",\n\t\t\ten: \"Error occured, no response reading emails\"\n\t\t},\n\t\t\"error.occur.reading.email\": {\n\t\t\tlt: \"Įvyko klaida nuskaitant el. laiškus\",\n\t\t\ten: \"Error occured reading emails\"\n\t\t},\n\t\t\"error.email.incorrect.login\": {\n\t\t\tlt: \"Neteisingas el. pašto adresas arba slaptažodis\",\n\t\t\ten: \"Invalid email address or password\"\n\t\t},\n\t\t\"success.read.email\": {\n\t\t\tlt: \"El. paštas sėkmingai nuskaitytas\",\n\t\t\ten: \"Successfully read email\"\n\t\t},\n\t\t\"email.notification.logs\": {\n\t\t\tlt: \"El. laiškų žurnalai\",\n\t\t\ten: \"Email notification logs\"\n\t\t}\n\t};\n\n\treturn messages[messagePath]?.[language] || messagePath;\n}","exampleData":null,"activeFrom":null,"activeTo":null,"active":false,"appDefinitionId":"2b574ae1-f627-4785-8c30-46124af1fb9b"},"additionalPlaces":[]}